package com.anita.member.domain.service;


import com.anita.member.common.FileInfo;
import com.anita.member.common.UploadResult;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * 图片存储服务接口
 * 定义统一的存储操作方法
 *
 * @author wuyunbin
 */
public interface ImageStorageService {

    /**
     * 上传图片
     *
     * @param file 图片输入流
     * @return 上传结果
     */
    UploadResult upload(MultipartFile file) throws IOException;

    /**
     * 删除图片
     *
     * @param fileName 文件名
     * @return 是否删除成功
     */
    boolean delete(String fileName);

    /**
     * 获取图片访问URL
     *
     * @param fileName 文件名
     * @return 访问URL
     */
    String getUrl(String fileName);

    /**
     * 列出指定前缀的文件
     *
     * @param prefix 文件名前缀
     * @param maxKeys 最大返回数量
     * @return 文件列表
     */
    List<FileInfo> listFiles(String prefix, int maxKeys);

    /**
     * 获取文件的详细信息
     *
     * @param fileName 文件名
     * @return 文件信息
     */
    FileInfo getFileInfo(String fileName);

    /**
     * 检查文件是否存在
     *
     * @param fileName 文件名
     * @return 文件是否存在
     */
    boolean exists(String fileName);

    /**
     * 批量删除文件
     *
     * @param fileNames 文件名列表
     * @return 删除结果列表（true表示删除成功，false表示删除失败）
     */
    List<Boolean> batchDelete(List<String> fileNames);

    /**
     * 生成预签名上传URL
     *
     * @param fileName 文件名
     * @param expiration 过期时间（秒）
     * @return 预签名上传URL
     */
    String generatePresignedUploadUrl(String fileName, long expiration);

    /**
     * 生成预签名下载URL
     *
     * @param fileName 文件名
     * @param expiration 过期时间（秒）
     * @return 预签名下载URL
     */
    String generatePresignedDownloadUrl(String fileName, long expiration);

    /**
     * 复制文件
     *
     * @param sourceFileName 源文件名
     * @param targetFileName 目标文件名
     * @return 是否复制成功
     */
    boolean copyFile(String sourceFileName, String targetFileName);

    /**
     * 移动文件
     *
     * @param sourceFileName 源文件名
     * @param targetFileName 目标文件名
     * @return 是否移动成功
     */
    boolean moveFile(String sourceFileName, String targetFileName);
}